package utils;
import java.util.Calendar;

/**  
 * 
 * @author Dimitri Verschueren
 * 
 * and Dimitri Breuval
 *
 */


public class Datum 
{
	Calendar cal = Calendar.getInstance();
	private int dag;
	private int maand;
	private int jaar;
	
	
	public void setDag(int dag) 
	{
		this.dag = dag;
	}
	public int getDag() 
	{
		return dag;
	}
	public void setMaand(int maand) 
	{
		this.maand = maand;
	}
	public int getMaand() 
	{
		return maand;
	}
	public void setJaar(int jaar) 
	{
		this.jaar = jaar;
	}
	public int getJaar() 
	{
		return jaar;
	}
	
	
	 //Default constructor
	 public Datum()
	{
		this.dag =(int) cal.get(Calendar.DATE);
        this.maand =(int) cal.get(Calendar.MONTH)+1;
        this.jaar =(int) cal.get(Calendar.YEAR);
 	}
	 
	 //Constructor via object Datum
	 public Datum(Datum inputDatum)
	 {
		 this.dag = inputDatum.dag;
		 this.maand = inputDatum.maand;
		 this.jaar = inputDatum.jaar;		 
	 }
	 
	 // Constructor via 3 int 
	 public Datum (int inputDag, int inputMaand, int inputJaar)
	 {
		 try{
			 if (setDatum(inputDag,inputMaand, inputJaar ) == true)
			 	{
				 this.dag = inputDag;
				 this.maand = inputMaand;
				 this.jaar = inputJaar;
			 	}
			 else
			 	{
		  throw new Exception ("Foute input !");
			 	}
		 	}
		 catch (Exception exp)
		 {
			 System.out.println(exp.getMessage());
		 }
		 
	 }
	 
	 // Constructor via string
	 public Datum (String inputStringDatum)
	 {
		 String tempDag = inputStringDatum.substring(0, 1);
		 String tempMaand = inputStringDatum.substring(3, 4);
		 String tempJaar = inputStringDatum.substring(6, 9);
		 
		 this.dag = Integer.parseInt( tempDag);
		 this.maand = Integer.parseInt(tempMaand);
		 this.jaar = Integer.parseInt(tempJaar);
	 }
	 
	 // Method for string datum in american format
	 public String 	getDatumInAmerikaansFormaat ()
	 {
		 StringBuffer returnDatum = new StringBuffer (Integer.toString(this.jaar))  ;
		 
		 returnDatum.append("/");
		 
		 returnDatum.append(Integer.toString(this.maand));
		 
		 returnDatum.append("/");
		 
		 returnDatum.append(Integer.toString(this.dag));
	       		 
		 return returnDatum.toString();	
		 
	 }
	 
	 //method to return stringDatum in European format
	 public String 	getDatumInEuropeesFormaat ()
	 {
		 StringBuffer returnDatum = new StringBuffer (Integer.toString(this.dag))  ;
		 
		 returnDatum.append("/");
		 
		 returnDatum.append(Integer.toString(this.maand));
		 
		 returnDatum.append("/");
		 
		 returnDatum.append(Integer.toString(this.jaar));
	       		 
		 return returnDatum.toString();		 
	 }

	
	// Check if this is a valid datum
	public boolean setDatum 
	(int inputDag, int inputMaand, int inputJaar)
	{
		boolean testResult = false;
		int testDagen = returnDayOfMonth(inputMaand, inputJaar) ;
		

		if (testDagen != -1)
		{
			if (inputDag >0 && inputDag < testDagen )
			{
				testResult = true;
			}
		}
		
		return testResult;
	}
	
	public String toString ()
	{
		return (this.dag + " " + this.maand + " " + this.jaar );		
	}
	
	public 	int verschilInJaren (Datum d) //returns difference in years between 2 date
	{
    this.jaar =(int) cal.get(Calendar.YEAR);
		int verschilJaren = this.jaar - d.jaar; 
		
		return verschilJaren;
		
	}
	
	public	int verschilInMaanden (Datum d) // returns difference in month between 2 date
	{	
    this.maand =(int) cal.get(Calendar.MONTH)+1;
    this.jaar =(int) cal.get(Calendar.YEAR);
		int verschilMaanden =((this.jaar*12)+ this.maand) - ((d.jaar * 12 )+d.maand);		
		
		return verschilMaanden;
	}
		

	public 	int verschilInDagen (Datum d) // returns difference in days between 2 date
	{		
		this.dag =(int) cal.get(Calendar.DATE);
    this.maand =(int) cal.get(Calendar.MONTH)+1;
    this.jaar =(int) cal.get(Calendar.YEAR);		
		
int verschilDagen = dagenTeller(this.dag, this.maand, this.jaar)- dagenTeller(d.dag, d.maand, d.jaar);
		
		return verschilDagen;
	}
	
	public boolean kleinerDan (Datum d) // Check if given date is lower than system date
	{
		boolean testResult = false;
			if ( this.jaar >= d.jaar )
				{
					if (this.maand >= d.maand )
					{
						if (this.dag> d.dag)
						{
							testResult = true;
						}	
					}
				}
		
		return testResult;
	}
	
	public boolean equals ()
	{
		return false;
	}
	
	public boolean compareTo ()
	{		
		return false;
	}
	
	// returns the number of days from a specific month (taking the leap-years in account)
	private int returnDayOfMonth ( int maand, int jaar)
	{
		int testDagen = 0;
		
			switch (maand)
			{
			case 1:
				testDagen = 31;
				break;
			case 2:
				if (jaar % 4 == 0 && jaar % 100 != 0 )
				{
					testDagen = 29;
				}
				else
				{
					testDagen = 28;
				}
				break;
			case 3:
				testDagen = 31;
				break;
			case 4:
				testDagen = 30;
				break;
			case 5:
				testDagen = 31;
				break;
			case 6:
				testDagen = 30;
				break;
			case 7:
				testDagen = 31;
				break;
			case 8:
				testDagen = 31;
				break;
			case 9:
				testDagen = 30;
				break;
			case 10:
				testDagen = 31;
				break;
			case 11:
				testDagen = 30;
				break;
			case 12:
				testDagen = 31;
				break;
			default:
				testDagen = -1;
				break;		
			}
			
		return testDagen;	
			
		}
		
		//Count the total number of days past from year 1
		private int dagenTeller (int inputDagen,int inputMaand ,int inputJaar)
		{
			int aantalDagen = 0;
			int maandDagen = 0;
			
			// Counting the days from the years
			for (int i = 1; i <= inputJaar; i++)
			{
				if (inputJaar % 4 == 0 && inputJaar %100 !=0) // counting the number of leap-years
				{
					aantalDagen++;
				}
				
			}
			aantalDagen = aantalDagen + (inputJaar * 365);// multilpy years and ad the leap-years (one extra day per leap-year)
			
			for (int e =1 ; e <= inputMaand; e++)
			{
				maandDagen += returnDayOfMonth(inputMaand, inputJaar) ;
			}
			aantalDagen = aantalDagen + maandDagen + inputDagen; 
			
			return aantalDagen;
			}
		
		
		
		
		
	}




